package com.time.util;

import com.time.domain.Product;
import com.time.domain.User;

import javax.servlet.http.HttpSession;
import java.util.ArrayList;
import java.util.List;

/**
 * @author 张龙佼
 * @Description session数据的存储和获取
 * @since 2020-10-14
 */

public class SessionUtils {

    /**
     * @param session 会话控制
     * @param user    需要保存的登录对象
     * @Description 将用户登录数据存储至session
     */
    public static void setUserSession(HttpSession session, User user) {
        session.setAttribute(User.USER_IN_SESSION, user);
    }

    /**
     * @param session 会话控制
     * @return 登录的用户对象
     * @Description 从session获取用户登录的数据
     */
    public static User getUserSession(HttpSession session) {
        Object objSession = session.getAttribute(User.USER_IN_SESSION);

        return objSession instanceof User ? (User) objSession : null;
    }


    /**
     * @param session  会话控制
     * @param cartList 购物车数据
     * @Description 将购物车数据存储至session
     */
    public static void setShoppingCartSession(HttpSession session, List<Product> cartList) {
        session.setAttribute(Product.SHOPPING_CART_IN_SESSION, cartList);
    }

    /**
     * @param session 会话控制
     * @return 购物车数据
     * @Description 从session获取购物车数据
     */
    public static List<Product> getShoppingCartSession(HttpSession session) {
        Object obj = session.getAttribute(Product.SHOPPING_CART_IN_SESSION);

        return castList(obj, Product.class);
    }

    /**
     * @param session 会话控制
     * @Description 移除session中购物车数据
     */
    public static void removeShoppingCartSession(HttpSession session) {
        session.removeAttribute(Product.SHOPPING_CART_IN_SESSION);
    }

    /**
     * @param obj   需要转换的目标对象
     * @param clazz 目标类
     * @param <T>   传参的类型
     * @return 返回T类型的集合
     * @Description 将未知的目标对象转未目标集合
     */
    public static <T> List<T> castList(Object obj, Class<T> clazz) {
        List<T> result = new ArrayList<>(); // 声明返回的集合

        // 将obj转为list集合
        if (obj instanceof List<?>) {
            for (Object o : (List<?>) obj) {
                result.add(clazz.cast(o));
            }
            return result;
        }

        return null;
    }
}
